package ecom.stateful;

import ecom.entity.*;
import ecom.api.IPanierStatefulRemote;

import java.io.Serializable;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.Remote;
import javax.ejb.SessionContext;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.ow2.util.log.*;



/**
 * 
 * @author Alexandra
 * La classe PanierStateful est le stateful bean qui va gerer le panier du client
 * 
 */

@Stateful(mappedName = "ecom.stateful.PanierStateful@Remote", description = "Panier Stateful ", name = "PanierStateful")
public class PanierStateful implements IPanierStatefulRemote, Serializable{
	
	private static final long serialVersionUID = 6850788584702247769L;

	private Set <ItemAchat> setAchat = new HashSet<ItemAchat>();

	@Resource
	private SessionContext sctxt;
	

	//la somme totale a payer
	private float total;
	
	//on utilise le Log fourni par ow2, qui est utilise aussi par JOnAS
	private Log log = LogFactory.getLog(PanierStateful.class);
	
	@PersistenceContext
    private EntityManager entityManager = null;

	public PanierStateful()
	{
		log.info("!!!!!!!!!!!!Creation panier!!!!!!!!");
		
	}

	/**
	 * @param idAnnonce  l'id de l'annonce pour lequel on achete les options. Id c'est l'id dans la BD
	 * @param titreAnnonce  le titre de l'annonce pour lequel on achete les options
	 * @param setOptionPayante La liste des options payantes en train d'etre achetees
	 * 							pour l'annonce avec l'id idAnnonce
	 */
	public void rajouterItems(long idAnnonce, String titreAnnonce, Set <OptionPayante> setOptionPayante) throws Exception
	{
		log.info("appele methode rajouterItems de PanierStateful");	
		ItemAchat item;
		for( OptionPayante optionPayante : setOptionPayante)
		{
			item = new ItemAchat(idAnnonce,titreAnnonce,optionPayante);
			setAchat.add(item);
		}
		if(setAchat.isEmpty())
				log.info("panier vide apres avoir rajoute ");
		else log.info("panier non vide");
		
		
	}
	
	public void rajouterItem(long idAnnonce, String titreAnnonce, OptionPayante optionPayante)
	{
		ItemAchat itemAchat = new ItemAchat(idAnnonce, titreAnnonce, optionPayante);
		setAchat.add(itemAchat);
		log.info("added in panier stateful option {0} pour article {1}",optionPayante.getNom(),titreAnnonce);
		
	}
	public void supprimerItem(long idAnnonce, long OptionPayanteId)
	{
		Set <ItemAchat> setAchatAux = new HashSet<ItemAchat>();
		
		for(ItemAchat item : setAchat)
		{
			if(item.getIdAnnonce() == idAnnonce)
					if(item.getOptionPanyante().getId()==OptionPayanteId)
					{
						log.info("option effache an" + idAnnonce + " opt:"+OptionPayanteId);
					}
					else
						setAchatAux.add(item);
			else
				setAchatAux.add(item);
			setAchat = new HashSet<ItemAchat>(setAchatAux);
			log.info("fin supprimerItem");
		}
	}

	public boolean FinaliserAchat() throws Exception {
		log.info("debut");
		if(setAchat!=null)
		{
			
			//String dateFormat = "yyyy-MM-dd";
			Calendar cal = Calendar.getInstance();
			cal.set(Calendar.HOUR_OF_DAY,0);
			cal.set(Calendar.MINUTE, 0);
			cal.set(Calendar.SECOND, 0);
			cal.set(Calendar.MILLISECOND, 0);    
			java.sql.Date dateAchat = new java.sql.Date(cal.getTime().getTime()); 
			
			for(ItemAchat itemAchat: setAchat)
			{
				int dureeDeVie = itemAchat.getOptionPanyante().getDureedevie();
				//une journee = 86400000 milisecondessecondes
				@SuppressWarnings("deprecation")
				
				java.sql.Date dateFin = new  java.sql.Date(cal.getTime().getTime() + dureeDeVie*86400000);
				OptionPayante optionPayante = itemAchat.getOptionPanyante();
				
					List <AnnonceEntity> listAnnonce = entityManager.createQuery("SELECT OBJECT(t) FROM AnnonceEntity AS t WHERE t.annonceid='"+itemAchat.getIdAnnonce()+"'").getResultList();
					int longueurListe = listAnnonce.size();
					if(longueurListe==0)
							throw new Exception("Erreur sur le serveur! On ne trouve plus l'annonce avec le titre " + itemAchat.getTitreAnnonce());
					else
							if( longueurListe >1 )
								throw new Exception("Erreur sur la base de donnees! On trouve des dupliquees pour l'annonce avec le titre " + itemAchat.getTitreAnnonce());
							else
							{
								try{
								log.info("debut persistance dans la bd OptionAchetee pour {0}",optionPayante.getDescription());
								OptionAchetee nouvelleOptionAchetee = new OptionAchetee(dateAchat, dureeDeVie, dateFin, optionPayante, listAnnonce.get(0));
								entityManager.persist(nouvelleOptionAchetee);
								log.info("fin persistance dans la bd OptionAchetee pour {0}",optionPayante.getDescription());
								}catch(Exception e)
								{
									log.error("erreur au moment de ecriture d'une  OptionAchetee dans la bd");
									return false;
								}
								
							}
								
					
				
				
			}
			//vider panier
			setAchat.clear();
			log.info("fin");
		}
			
		
		
		
		return true; // return true si l'achat s'est bien fini
	}

	public boolean AjouterOption(OptionPayante optionPayante) {
		
		return true;
	}
	
	public float getTotal()
	{
		return total;
	}
	public String viderPanier()
	{
		setAchat.clear();
		total = 0;
		log.info("viderPanier: " + setAchat.size());
		return "Panier";
	}
	
	//*****************GETERS & SETERS****************************
	public Set<ItemAchat> getSetAchat() {
		if(setAchat.isEmpty())
			log.info("panier vide");
		else log.info("panier non vide");
		return setAchat;
	}

	public void setSetAchat(Set<ItemAchat> setAchat) {
		this.setAchat = setAchat;
	}
	public void testPanier()
	{
		log.info("test panier stateful");
	}

}
